前端面试题(八)关于this指向的问题 您所在的位置:网站首页 leadership values 前端面试题(八)关于this指向的问题

前端面试题(八)关于this指向的问题

2022-12-20 16:33| 来源: 网络整理| 查看: 265

1、求解答为什么x.x调用结果会是undefined function a(xx){ this.x = xx; return this; } var x = a(5); var y = a(6); console.log(x.x); console.log(y.x);

提问者问题是:

求解答为什么x.x调用结果会是undefined

现在来分析下为什么会输出undefined:

var x = a(5); 执行过程中,由于函数a是在全局作用域调用,所以,函数内部的this指向window。所以this.x = 5; 相当于:window.x = 5; return this,也就是说var x = a(5); 中的x变量的值是window   =>   var x = window; 这里的x将函数内部的x的值覆盖了。     为什么会覆盖??         因为:所有使用var声明的全局对象,都是window对象的属性。window.x和 在全局使用var声明的x是同一个变量。 然后执行console.log(x.x); 实际上是:console.log(window.x); window对象中没有x属性,所以会输出undefined

访问一个对象的属性的时候,如果这个对象没有这个属性,会返回undefined。如下:

let obj = { a: 1 } console.log(obj.a); // 1 console.log(obj.b); // undefined

 

2、下面的代码输出什么 let length = 10; function fn() { console.log(this.length); } var obj = { length: 5, method: function(fn) { fn(); arguments[0](); } } obj.method(fn, 1);

上面的代码输出什么?下面来详细解析

首先来看代码执行,obj.method(fn, 1); obj对象里边的method是一个函数,它里边的fn()执行的时候,应用了this默认绑定规则(点击这里查看为什么是应用了默认绑定规则),所以this指向window window.length是等于0,所以执行这行语句的时候会输出 0 。 有人会问,全局作用域不是声明了一个length对象吗?为什么不是输出10? 原因是这个length对象使用let关键字声明的,它不属于全局window对象的一个属性,所以window.length 和它(let length = 10)是两个不同的对象。这是一个坑!

接下来是执行arguments[0]();  arguments对象是一个类数组,它的第0位下标是实参列表的第1个参数,也就是fn函数。 当这个fn函数调用的时候,它的this被绑定到arguments对象上。 因为obj.method传入了两个参数,所以arguments对象的length属性为2



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有